contents
파티셔닝과 샤딩은 대규모 데이터베이스를 관리하고 확장하기 위한 두 가지 중요한 기술입니다. 종종 혼용되어 사용되지만, 두 용어는 뚜렷한 의미를 가집니다.
간단히 말해, 파티셔닝은 큰 데이터베이스 테이블을 더 작고 관리하기 쉬운 조각으로 나누는 일반적인 개념입니다. 샤딩은 이러한 조각들을 여러 개의 개별 서버에 분산시키는 특정 _유형_의 파티셔닝, 즉 수평 파티셔닝을 의미합니다.
파트 1: 데이터베이스 파티셔닝 (일반적인 개념) 🔪
데이터베이스 파티셔닝은 테이블이나 인덱스와 같은 큰 데이터베이스 객체를 더 작고 독립적인 부분으로 나누는 과정입니다. 이러한 부분, 즉 파티션들은 동일한 데이터베이스 서버 내에서 별도로 저장되고 관리될 수 있습니다.
파티셔닝의 주요 목표는 다음과 같습니다.
-
성능 향상: 전체 테이블 대신 관련된 파티션만 스캔함으로써 쿼리가 훨씬 빨라질 수 있습니다. 예를 들어, 판매 테이블을 월별로 파티셔닝하면 7월의 판매 데이터를 조회하는 쿼리는 "7월" 파티션만 보면 됩니다.
-
관리 용이성 향상: 거대한 테이블 전체보다 작은 파티션에 대해 유지보수 작업(인덱스 재구성, 데이터 백업 등)을 수행하는 것이 더 쉽습니다.
-
가용성 증대: 특정 파티션에 문제가 발생하여 사용할 수 없게 되더라도, 테이블의 다른 파티션들은 종종 계속 온라인 상태를 유지할 수 있습니다.
파티셔닝의 종류
A. 수평 파티셔닝 (행 기반 분할)
가장 일반적인 유형의 파티셔닝입니다. 테이블을 행(row) 을 기준으로 여러 개의 작은 테이블로 분할합니다. 각 파티션은 동일한 열을 가지지만, 서로 다른 행의 하위 집합을 포함합니다.
-
비유: 거대한 단일 볼륨의 전화번호부를 상상해 보세요. 수평 파티셔닝은 이것을 이름이 '가-바'인 볼륨과 '사-하'인 볼륨 두 개로 나누는 것과 같습니다.
-
예시:
Users테이블을 가입 연도별로 파티셔닝할 수 있습니다.-
파티션 1: 2023년에 가입한 사용자.
-
파티션 2: 2024년에 가입한 사용자.
-
B. 수직 파티셔닝 (열 기반 분할)
이 방식에서는 테이블을 열(column) 을 기준으로 분할합니다. 일부 열은 새 테이블로 이동하고, 나머지 열은 그대로 유지됩니다. 새로운 테이블들은 동일한 수의 행을 공유합니다.
-
비유: 전화번호부의 각 사람에 대해 이름과 번호는 한 페이지에 저장하고, 매우 길고 거의 사용되지 않는 주소 이력은 별도의 페이지에 저장하는 것과 같습니다.
-
예시:
UserProfile테이블에user_id,username,email및 매우 큰profile_picture_blob열이 있을 수 있습니다.profile_picture_blob을 자체 테이블로 이동시켜 수직 파티셔닝하면, 사용자 이름과 이메일만 필요한 쿼리의 속도를 높일 수 있습니다.
파트 2: 데이터베이스 샤딩 (수평 확장) 🚀
샤딩은 데이터를 여러 개의 다른 데이터베이스 서버에 분산시키는 수평 파티셔닝의 특정 구현 방식입니다. 각 서버는 샤드(shard) 가 되며, 전체 데이터셋의 일부를 보유합니다.
샤딩의 주요 목표는 수평적 확장성(스케일 아웃) 입니다. 단일 서버는 CPU, RAM, 디스크 공간에 한계가 있습니다(수직적 확장). 샤딩은 데이터와 작업 부하를 여러 서버에 분산시킴으로써 이러한 한계를 극복합니다.
샤딩 전략 (데이터 분할 방법)
어떤 데이터를 어느 샤드에 넣을지는 샤드 키(shard key) 에 의해 결정됩니다. 이는 user_id나 customer_id와 같이 테이블의 특정 열(또는 여러 열)입니다.
A. 키 기반 샤딩 (해시 샤딩)
가장 일반적인 전략입니다. 샤드 키를 해시 함수에 통과시킨 후, 해시 함수의 출력이 데이터가 속할 샤드를 결정합니다.
-
작동 방식:
샤드_ID = hash(user_id) % 샤드_개수 -
장점: 데이터를 매우 균등하게 분산시키는 경향이 있어 "핫스팟"(하나의 샤드가 과부하되는 현상)을 방지합니다.
-
단점: 샤드를 추가하거나 제거하기 어려울 수 있습니다. 모든 데이터를 재해싱하고 이동해야 할 수 있기 때문입니다. (최신 기술인 '일관성 해싱'이 이 문제를 해결하는 데 도움이 됩니다.)
B. 범위 기반 샤딩
샤드 키 값의 범위를 기준으로 데이터를 파티셔닝합니다.
-
작동 방식:
-
샤드 1:
user_id1부터 1,000,000까지 -
샤드 2:
user_id1,000,001부터 2,000,000까지
-
-
장점: 구현이 간단하고, 데이터 범위를 요청하는 쿼리(예: "ID가 500,000에서 600,000 사이인 모든 사용자 찾기")에 매우 효율적입니다.
-
단점: 데이터가 불균등하게 분산되어 핫스팟이 발생할 수 있습니다. 예를 들어, 새 사용자에게 순차적인 ID가 할당되면 모든 새로운 쓰기 트래픽이 마지막 샤드에 집중될 것입니다.
C. 디렉터리 기반 샤딩
조회 테이블("디렉터리")이 어떤 샤드가 어떤 데이터를 보유하고 있는지에 대한 매핑을 유지합니다.
-
작동 방식: 애플리케이션은 먼저 디렉터리를 쿼리하여 연결해야 할 샤드를 알아낸 다음, 해당 샤드에 쿼리를 보냅니다.
-
장점: 파티셔닝 방식을 매우 유연하게 정의할 수 있습니다.
-
단점: 디렉터리 자체가 성능 병목 현상이나 단일 실패 지점이 될 수 있습니다.
요약: 파티셔닝 vs. 샤딩
| 특징 | 파티셔닝 | 샤딩 |
|---|---|---|
| 정의 | 데이터를 더 작은 조각으로 나누는 일반적인 개념 | 파티셔닝의 한 유형 (수평) |
| 범위 | 단일 데이터베이스 서버 내에서 가능 | 항상 여러 데이터베이스 서버에 걸쳐 있음 |
| 주요 목표 | 관리 용이성, 성능 | 확장성 |
샤딩의 어려움
샤딩은 매우 강력하지만 상당한 복잡성을 야기합니다.
-
샤드 간 조인: 여러 샤드의 데이터를 결합해야 하는 쿼리는 매우 비효율적이고 실행하기 복잡합니다.
-
리밸런싱: 새 샤드를 추가하면 기존 샤드에서 새 샤드로 데이터를 이동해야 하는데, 이는 복잡하고 리소스를 많이 소모하는 작업일 수 있습니다.
-
복잡성: 애플리케이션과 인프라가 샤딩된 아키텍처를 인지하고 있어야 합니다. 더 이상 단일 데이터베이스가 아닌 분산 시스템을 다루게 됩니다.
references